﻿package com 
{
	import app.facade.App;
	import app.view.component.loading.LoaderNonCache;
	import com.greensock.loading.core.LoaderItem;
	import com.greensock.loading.display.ContentDisplay;
	import com.greensock.loading.SWFLoader;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.display.LoaderInfo;
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.filters.ColorMatrixFilter;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	import flash.net.Socket;
	import flash.text.TextField;
	import flash.text.TextFormat;
	import flash.utils.ByteArray;
	import flash.geom.Matrix;
	import com.greensock.loading.LoaderMax;
	import com.greensock.loading.SWFLoader;
	
	/**
	 * Utils class
	 * 
	 * @version	1.0.0
	 * 
	 * @author	KiemPV
	 * 
	 * @exclude
	 */	
	public class Utils 
	{	
		public function Utils() 
		{
		}
		
		/**
		 * 
		 * @param	timeInMs: in minisecond
		 * @return
		 */
		public static function unixTimeToDateTime(timeInMs:Number):Date {
			var currDate:Date = new Date(timeInMs);
			//currDate.
			return currDate;
		}
		
		public static function dateTimeToUnixtime(time:Date):uint {
			var currDate:uint =  Math.round( time.getTime() * 0.001);
			return currDate;
		}
		
		public static function readStringFromSocket(socket:Socket):String
		{
			var str:String = "";
			try {
				var byteNum:uint = socket.bytesAvailable;
				if (byteNum > 3) {
					var notempty:uint = socket.readUnsignedByte();
					if (notempty == 1) {
						var size:uint = socket.readUnsignedShort();
						if (size > 0 && ((byteNum-3) >= size)) {
							str = socket.readUTFBytes(size);
						}
					}
				}
			} catch (e:Error) {
				
			}
			return str;
		}
		
		public static function readInt64FromSocket(socket:Socket):String
		{
			var value:String = "";
			var mark:int = 0;
			
			mark = socket.readUnsignedByte();
			
			if (mark == 1) {
				value = socket.readUnsignedInt().toString(10);
			} else {
				value = socket.readUTFBytes(mark);
			}
				
			return value;
		}
		
		public static function writeStringToSocket(str:String, socket:Socket):void {
			try {
				if (str == null) return;
				if (str.length <= 0) {
					socket.writeByte(0);
				} else {
					var utf8Bytes:ByteArray = new ByteArray();
					utf8Bytes.writeUTFBytes(str);
					socket.writeByte(1); // is not empty
					socket.writeShort(utf8Bytes.length);
					socket.writeBytes(utf8Bytes)
				}
			} catch (e:Error) {
				
			}
		}

		public static function writeInt64ToSocket(str:String, socket:Socket):void {
			
			if (str.charCodeAt(0) == 0x002D) { //"-"
					var utf8Bytes:ByteArray = new ByteArray();
					utf8Bytes.writeUTFBytes(str);
					socket.writeByte(utf8Bytes.length);
					socket.writeBytes(utf8Bytes)				
			} else {
				var uintV:uint = 0;
				try {
					uintV = uint(str);
				} catch (e2:Error) { };				
				if (uintV.toString(10) == str) {
					socket.writeByte(1);
					socket.writeUnsignedInt(uintV);					
				} else {
					utf8Bytes = new ByteArray();
					utf8Bytes.writeUTFBytes(str);
					socket.writeByte(utf8Bytes.length);
					socket.writeBytes(utf8Bytes)					
				}

			}
			
		}
		
		public static function readStringFromBuffer(buffer:ByteArray):String
		{
			var str:String = "";
			try {
				var byteNum:uint = buffer.bytesAvailable;
				if (byteNum > 3) {
					var notempty:uint = buffer.readUnsignedByte();
					if (notempty == 1) {
						var size:uint = buffer.readUnsignedShort();
						if (size > 0 && ((byteNum-3) >= size)) {
							str = buffer.readUTFBytes(size);
						}
					}
				}
			} catch (e:Error) {
				
			}
			return str;
		}
		
		public static function readBytesFromBuffer(buffer:ByteArray):ByteArray
		{
			var r:ByteArray = new ByteArray();
			try {
				var mode:int = buffer.readUnsignedByte();
				if (mode == 0) {
					return r;
				} else if (mode == 1) {
					var len:int = buffer.readUnsignedShort();
					buffer.readBytes(r, 0, len);
				}
			} catch (e:Error) {
				
			}
			return r;
		}
		
		public static function writeBytesToBuffer(bytes:ByteArray, buffer:ByteArray):void {
			try {
				buffer.writeShort(bytes.length);
				buffer.writeBytes(bytes);
			} catch (e:Error) {
				
			}
		}
		
		public static function getId(buffer:ByteArray):uint
		{
			var id:uint = 0;
			var pos:uint = buffer.position;
			id = buffer.readUnsignedInt();
			buffer.position = pos;
			return id;
		}
		
		public static function getInt64Id(buffer:ByteArray):String
		{
			var id:String = "";
			var pos:uint = buffer.position;
			id = readInt64FromBuffer(buffer);
			buffer.position = pos;
			return id;
		}
		
		public static function readInt64FromBuffer(buffer:ByteArray):String
		{
			var value:String = "";
			var mark:int = 0;
			
			mark = buffer.readUnsignedByte();
			
			if (mark == 1) {
				value = buffer.readUnsignedInt().toString(10);
			} else {
				value = buffer.readUTFBytes(mark);
			}
				
			return value;
		}
		
		public static function writeStringToBuffer(str:String, buffer:ByteArray):void {
			try {
				if (str == null) return;
				if (str.length <= 0) {
					buffer.writeByte(0);
				} else {
					var utf8Bytes:ByteArray = new ByteArray();
					utf8Bytes.writeUTFBytes(str);
					buffer.writeByte(1); // is not empty
					buffer.writeShort(utf8Bytes.length);
					buffer.writeBytes(utf8Bytes)
				}
			} catch (e:Error) {
				
			}
		}
		
		public static function writeInt64ToBuffer(str:String, buffer:ByteArray):void {
			if (str.charCodeAt(0) == 0x002D) { //"-"
					var utf8Bytes:ByteArray = new ByteArray();
					utf8Bytes.writeUTFBytes(str);
					buffer.writeByte(utf8Bytes.length);
					buffer.writeBytes(utf8Bytes)				
			} else {
				var uintV:uint = 0;
				try {
					uintV = uint(str);
				} catch (e2:Error) { };				
				if (uintV.toString(10) == str) {
					buffer.writeByte(1);
					buffer.writeUnsignedInt(uintV);					
				} else {
					utf8Bytes = new ByteArray();
					utf8Bytes.writeUTFBytes(str);
					buffer.writeByte(utf8Bytes.length);
					buffer.writeBytes(utf8Bytes)					
				}

			}
		}
		
		public static function scaleImage(image:DisplayObject, sx:Number, sy:Number):DisplayObject {
			var	scaleMatrix:Matrix = new Matrix();//scale matrix
			scaleMatrix.scale(sx, sy);
			image.transform.matrix = scaleMatrix;
			return image;
		}
		
		public static function getRand(lowerLimit:Number, upperLimit:Number):Number
		{
			var result:Number = 0;
			if (lowerLimit == upperLimit) {
				result = lowerLimit;
			} else {
				if (lowerLimit > upperLimit) { //DOI CHO 2 BIEN
					lowerLimit = lowerLimit + upperLimit;
					upperLimit = lowerLimit - upperLimit;
					lowerLimit = lowerLimit - upperLimit;			
				}

				var randomNumber:Number = Math.random();		   
				result = (upperLimit - lowerLimit) * randomNumber + lowerLimit;
			}
			return result;
		}
		
		public static function scaleToFit(mcObj:DisplayObject, width:Number, height:Number):DisplayObject {
			if (width > 1 && height > 1) {
				var ow:Number = mcObj.width;
				var oh:Number = mcObj.height;
				
				if (ow != width || oh != height) {
					var ratio:Number = width / ow;
					var newW:Number = width;
					var newH:Number = ratio * oh;
					if (newH > height) {
						newH = height;
						ratio = height / oh;
						newW = ratio * ow;
					}
					mcObj.width = newW;
					mcObj.height = newH;
				}
			}
			return mcObj;
		}	
		
		public static function scaleToFitAroundCenter(object:DisplayObject, width:Number, height:Number):void
		{
			var ow:Number;
			var oh:Number;
			var ratio:Number = 1;
			var mcBound:Rectangle = object.getBounds(object);;
	
			if (width > 1 && height > 1)
			{
				ow = object.width;
				oh = object.height;
				if (ow != width || oh != height) {
					ratio = width / ow;
					var newH:Number = oh * ratio;
					if (newH > height)
					{
						ratio = height / oh;
					}
					
					var affineTransform:Matrix = new Matrix();
					affineTransform = new Matrix(ratio, 0, 0, ratio, 0, 0);
					object.transform.matrix = affineTransform;
					
					//
					
				}
				
			}
			object.x = object.x - mcBound.x * ratio - object.width / 2 + 70/2;  
			object.y = object.y - mcBound.y * ratio - object.height / 2 + 70/2;
		}
		
		public static function convertSecondToTimeString(secondNumber:int):String {
			var hour:int = secondNumber / 3600;
			var minute:int = (secondNumber - (hour * 3600)) / 60;
			var second:int = secondNumber % 60;
			
			var timeStr:String = ((hour < 10)?("0" + hour.toString()):(hour.toString())) + ":" +
								((minute < 10)?("0" + minute.toString()):(minute.toString())) + ":" +
								((second < 10)?("0" + second.toString()):(second.toString()));			
			return timeStr;
		}
		
		public static function getUnknownTime():String {
			return "--:--:--";
		}
		
		public static function swap(list:*, i:int, j:int):void {
			var temp:* = list[i];
			list[i] = list[j];
			list[j] = temp;
		}
		
		/**
		 * Loại bỏ các pixel có alpha nhất định
		 */
		public static function removeAlphaPixel(bmd:Bitmap):void
		{
			bmd.bitmapData.lock(); 
			bmd.bitmapData.threshold(bmd.bitmapData, new Rectangle(0, 0, bmd.width, bmd.height), new Point(0, 0), "<", 0x55000000, 0x00000000, 0xFF000000, true);
			bmd.bitmapData.unlock();
		}
		
		public static function calculateEllipsis(field:TextField):String
		{
			var strlen:int = field.text.length;
			var strWidth:Number = field.textWidth;
			var averageCharLen:Number = strWidth / strlen;
			var approxCharAmount:Number = field.width / averageCharLen;
			var newStr:String;
			if (strWidth > field.width) 
			{
				newStr = field.text.substr(0, approxCharAmount - 4) + "...";
			}
			else
			{
				newStr = field.text;
			}
			return newStr;
		}
		
		/**
		 * Hàm này chia line thành 2 sub-string. Với điều kiện điểm chia cắt phải cắt ở giữa của 2 từ và
		 * sub-string đầu tiên có độ dài hiển thị không vượt quá maxWidth.
		 * @param	line
		 * @param	textWidth Độ dài hiển thị của line.
		 * @param	maxChar
		 * @return
		 */
		public static function breakLine(line:String, textWidth:Number, maxWidth:Number):Array {
			var r:Array = new Array();
			var len:int = line.length;
			if (textWidth <= maxWidth) {
				r.push(line);
				return r;
			}
			
			var subLen:int = int(Math.floor((len * maxWidth) / textWidth));
			if (subLen <= 0) {
				r.push("");
				r.push(line);
				return r;				
			}			
			if (subLen >= len) {
				r.push(line);
				r.push("");
				return r;				
			}
			
			var char:String = line.charAt(subLen);
			if (char == " ") {
				subLen++;
				while ((subLen < len) && (line.charAt(subLen) == " ")) {
					subLen++;
				}
				if (subLen < len) {
					r.push(line.substr(0, subLen));
					r.push(line.substr(subLen));					
				} else {
					r.push(line);
					r.push("");
					return r;						
				}				
			} else {
				char = line.charAt(subLen - 1);
				if (char == " ") {
					r.push(line.substr(0, subLen));
					r.push(line.substr(subLen));					
				} else {
					var idx:int = subLen - 1;
					while ((idx >= 0) && (line.charAt(idx) != " ")) {
						idx--;
						subLen--;
					}
					if (idx > 0) {
						r.push(line.substr(0, subLen));
						r.push(line.substr(subLen));					
					} else {
						r.push("");
						r.push(line);
						return r;						
					}
				}
			}
			return r;
		}
		
		public static function toLowerFirst(str:String):String {
			if (str.length > 0) {
				var r:String = str.charAt(0).toLowerCase();
				r = r + str.substring(1);
				return r;
			}
			return "";
		}
		
		public static function toUpperFirst(str:String):String {
			if (str.length > 0) {
				var r:String = str.charAt(0).toUpperCase();
				r = r + str.substring(1);
				return r;
			}
			return "";
		}
		
		public static function generateRandomString(newLength:uint = 1, userAlphabet:String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"):String
		{
			var alphabet:Array = userAlphabet.split("");
			var alphabetLength:int = alphabet.length;
			var randomLetters:String = "";
			for (var i:uint = 0; i < newLength; i++){
				randomLetters += alphabet[int(Math.floor(Math.random() * alphabetLength))];
			}
			return randomLetters;
		}
		
		public static function getIconCount(gonValue:int, n:int):int {
			if (gonValue > 0) {
				var r:int = gonValue / n;
				if ((gonValue % n) != 0) {
					r++;
				}
				return r;
			}
			return 0;
		}	
		
		public static function trim(s:String):String {
			return s.replace(/(\t|\f|\r|\n|\s{2,})/g, '');  			
		}
		
		public static function formatString(pattern:String, ...args):String {
			var s:String = pattern;
			try {
				var i:int = args.length;
				while (i--) {
					s = s.replace(new RegExp('\\{' + i + '\\}', 'ig'), args[i]);
				}
			} catch (e:Error) {
			}
			return s;
		}	
		
		public static function isComma(s:String):Boolean {
			if ((s == ".") || 
				(s == ",")) {
					return true;
			}
			return false;
		}
		
		/**
		 * Vẽ một mũi tên lên canvas hướng từ điểm 'from' tới điểm 'to'.
		 */
		public static function drawArrow(canvas:*, from:Point, to:Point, color:uint=0xFF0000, thickness:Number=1, alpha:Number=1):void {
			canvas.graphics.lineStyle(thickness, color, alpha);
			canvas.graphics.moveTo(from.x, from.y);
			canvas.graphics.lineTo(to.x, to.y);
			var v:Point = to.subtract(from);
			var n:Point = new Point( -v.y, v.x); /// n _|_ v
			var v_len:Number = v.length;
			
			/// Ta sẽ vẽ tam giác đều ở đầu mũi tên để làm phần mũi nhọn của mũi tên.
			/// Độ dài cạnh của tam giác đều.
			var s:Number = 10;
			/// Tính độ dài của đầu nhọn dọc theo trục xác định bởi thân mũi tên.
			var l:Number = Math.sqrt(s * s - s * s * 0.25); ///Áp dụng định lý Pitago trong tam giác vuông.
			if (v_len <= l) {
				s = 5;
				l = Math.sqrt(s * s - s * s * 0.25); ///Áp dụng định lý Pitago trong tam giác vuông.
			}
			if (v_len > l) {
				///Dịch chuyển điểm 'to' về hướng điểm 'from' một đoạn l, để xác định điểm bắt đầu của đầu nhọn trên trục mũi tên.
				///Xác định vector dịch chuyển. Chiều dịch chuyển ngược hướng với v.
				var v1:Point = new Point( -1 * v.x, -1 * v.y); 
				v1.normalize(l);
				///Sau đó, tiếp tục dịch sang bên trái, theo hướng của vector n một đoạn = s/2 để xác định điểm góc nhọn bên trái của đầu mũi tên.
				var v2:Point = new Point(n.x, n.y);
				v2.normalize(s * 0.5);
				///Xác định được điểm góc nhọn bên trái của mũi tên.
				var c1:Point = new Point(to.x + v1.x + v2.x, to.y + v1.y + v2.y);
				///Xác định được điểm góc nhọn bên phải của mũi tên.
				var c2:Point = new Point(to.x + v1.x - v2.x, to.y + v1.y - v2.y);
				/// Điểm góc nhọn còn lại chính là 'to'.
				
				canvas.graphics.beginFill(color, alpha);
				canvas.graphics.moveTo(c1.x, c1.y);
				canvas.graphics.lineTo(c2.x, c2.y);
				canvas.graphics.lineTo(to.x, to.y);
				canvas.graphics.lineTo(c1.x, c1.y);
				canvas.graphics.endFill();
			} else {
				/// Nhỏ quá, ko hiện đầu mũi tên.
			}
		}
		
		/**
		 * Tính toán điểm giao nhau của 2 đường thẳng trong không gian 2 chiều.
		 * Hai đường thẳng bất kỳ trong không gian 2 chiều thì chỉ có thể cắt nhau, hoặc trùng nhau, hoặc song song.
		 * Nếu 2 đường thẳng song song và không trùng nhau thì trả về null.
		 * Nếu 2 đường thẳng trùng nhau thì trả về điểm gốc (x1, y1).
		 * Nếu 2 đường thẳng cắt nhau thì trả về giao điểm.
		 * @param	x1
		 * @param	y1
		 * @param	x2
		 * @param	y2
		 * @param	x3
		 * @param	y3
		 * @param	x4
		 * @param	y4
		 * @author KiemPV
		 * @return
		 */
		public static function calcIntersectionPointOfTwoLines(x1:Number, y1:Number, x2:Number, y2:Number, x3:Number, y3:Number, x4:Number, y4:Number):Point {
			var epsilon:Number = 1.0e-6;
			/// Tính toán các vector chỉ phương của 2 đường thẳng.
			var v1:Point = new Point(x2 - x1, y2 - y1); /// Là chỉ phương của đường thẳng L1
			var v2:Point = new Point(x4 - x3, y4 - y3); /// Là chỉ phương của đường thẳng L2
			var l1:Number = v1.length;
			var l2:Number = v2.length;
			if (l1 < epsilon && l2 < epsilon) {
				if ((Math.abs(x1 - x3) < epsilon) && (Math.abs(y1 - y3) < epsilon)) {
					/// Tất cả 4 điểm bị chập làm 1.
					return new Point(x1, y1);
				} else {
					return null; /// Không xác định được giao điểm.
				}
			} else if (l1 < epsilon && l2 >= epsilon) {
				/// Ta xác định được đường thẳng qua hai điểm (x3, y3) và (x4, y4), còn 2 điểm kia bị trùng nhau.
				/// Ta xác định xem điểm (x1, y1) có nằm trên đường thẳng qua ai điểm (x3, y3) và (x4, y4) hay ko.
				if ((Math.abs(v2.x) < epsilon) && (x1 == x3)) {
					/// L2 là đường thẳng song song với trục Y và cắt X tại điểm x = x3.
					return new Point(x1, y1);
				} else if ((Math.abs(v2.y) < epsilon) && (y1 == y3)) {
					/// L2 là đường thẳng song song với trục X và cắt Y tại điểm y = y3.
					return new Point(x1, y1);
				} else {
					if (Math.abs( (x1 - x3) / v2.x - (y1 - y3) / v2.y ) < epsilon) {
						return new Point(x1, y1);
					} else {
						return null; ///Không có giao điểm.
					}
				}
			} else if (l1 >= epsilon && l2 < epsilon) {
				/// Ta xác định được đường thẳng qua hai điểm (x1, y1) và (x2, y2), còn 2 điểm kia bị trùng nhau.
				/// Ta xác định xem điểm (x3, y3) có nằm trên đường thẳng qua ai điểm (x1, y1) và (x2, y2) hay ko.
				if ((Math.abs(v1.x) < epsilon) && (x1 == x3)) {
					/// L1 là đường thẳng song song với trục Y và cắt X tại điểm x = x3.
					return new Point(x3, y3);
				} else if ((Math.abs(v1.y) < epsilon) && (y1 == y3)) {
					/// L1 là đường thẳng song song với trục X và cắt Y tại điểm y = y3.
					return new Point(x3, y3);
				} else {
					if (Math.abs( (x3 - x1) / v1.x - (y3 - y1) / v1.y ) < epsilon) {
						return new Point(x3, y3);
					} else {
						return null; ///Không có giao điểm.
					}
				}
			} else {
				/// Check 2 đường thẳng có song song hoặc trùng nhau hay ko.
				/// Nếu tồn tại k sao cho v1 = k * v2 thì 2 đường thẳng //.
				/// Nếu k = 1 thì 2 đường thẳng trùng nhau.
				if (isColinear(v1, v2)) {
					if ( Math.abs(v2.x * (y1 - y3) - v2.y * (x1 - x3)) < epsilon ) {
						/// 2 Đường thẳng trùng nhau.
						return new Point(x1, y1);
					} else {
						return null;
					}
					
				} else {
					/// Tính toán giao điểm.
					var t:Number = (v1.y * (x3 - x1) - v1.x * (y3 - y1)) / (v1.x * v2.y - v1.y * v2.x);
					var x:Number = x3 + v2.x * t;
					var y:Number = y3 + v2.y * t;
					return new Point(x, y);
				}
			}
			
		}
		
		/**
		 * Check xem 2 vector v1 và v2 có song song với nhau hay ko.
		 * @param	v1
		 * @param	v2
		 * @return
		 */
		public static function isColinear(v1:Point, v2:Point):Boolean {
			var k:Number = 0.0;
			if ( Math.abs(v1.x) >= 1.0e-6 ) {
				k = v2.x / v1.x;
				if (Math.abs(v1.y * k - v2.y) < 1.0e-6) {
					return true;
				} else {
					return false;
				}
			} else if (Math.abs(v1.y) >= 1.0e-6) {
				k = v2.y / v1.y;
				if (Math.abs(v1.x * k - v2.x) < 1.0e-6) {
					return true;
				} else {
					return false;
				}				
			} else {
				/// Vector 0 luôn cùng phương với mọi vector khác.
				return true;
			}
		};		
		
		
		/**
		 * thêm chấm vao số
		 * @param	coint
		 * @return
		 */
		public static function addDotsNumber(coint:int):String {
			return String(coint.toString()).replace( /\d{1,3}(?=(\d{3})+(?!\d))/g , "$&.");
		}
		
		/**
		 * chuyển từ số sang kiểu K,M xì tin
		 * @param	coint
		 * @return
		 */
		public static function conversionPay(number:int):String {
			var strCoint:String = number.toString();
			var result:String = "";
			var c:Number;
			// hàng nghìn
			if (strCoint.length >= 4 && strCoint.length <= 6) {
				c = number / 1000;
				result = c + "k";
			}else if (strCoint.length > 6) {
				c = number / 1000000;
				result = c + "M";
			}else {
				result = strCoint;
			}
			
			return result;
		}
		
		public static function createHitArea(mc:Sprite, grainSize:uint=1):Sprite{
			var _hitarea:Sprite = new Sprite();
			var bound:Rectangle = mc.getBounds(mc);
			var bitmapData:BitmapData = new BitmapData(mc.width, mc.height, true, 0x000000);
			bitmapData.draw(mc, new Matrix(1, 0, 0, 1, -bound.x, -bound.y));

			//trace("DATA W " + bitmapData.width + " DATA H " + bitmapData.height + " bound x " + bound.x + " " + bound.y);
			_hitarea.graphics.beginFill(0x000000, 1.0);			
			for(var x:int=0;x<bitmapData.width;x+=grainSize) {
				for (var y:int = 0; y < bitmapData.height; y += grainSize) {		
					if(x<bitmapData.width && y<bitmapData.height && bitmapData.getPixel(x,y)!=0) {
						_hitarea.graphics.drawRect(x,y,grainSize,grainSize);						
					}					
				}
			}			
			_hitarea.graphics.endFill();
			_hitarea.x = bound.x;
			_hitarea.y = bound.y;
			//_hitarea.cacheAsBitmap = true;
			mc.addChild(_hitarea);
			_hitarea.visible = false;
			mc.hitArea = _hitarea;
			return _hitarea;
		}
		
		public static function createBackgroundForm():Sprite {
			//if (mai == null) return new Sprite();
			
			var mWidth:Number = Main.ROOT.stage.stageWidth + 4;
			var mHeight:Number = Main.ROOT.stage.stageHeight + 4;
			//var posX:Number = (Main.ROOT.loaderInfo.width - Main.ROOT.stage.stageWidth) / 2 - 2;
			//var posY:Number = (Main.ROOT.loaderInfo.height - Main.ROOT.stage.stageHeight) / 2 - 2;
			
			var posX:Number =0// -mWidth / 2;
			var posY:Number =0// -mHeight / 2;

			var backgroundForm:Sprite = new Sprite();	
			backgroundForm.name = "transparentBg";
			
			backgroundForm.graphics.beginFill(0x000000, 0.7);
			backgroundForm.graphics.drawRect(posX, posY, mWidth, mHeight);
			backgroundForm.graphics.endFill();	
			return backgroundForm;
		}
		
		public static function getTextFormat(_size:Number, _bold:Boolean, _italic:Boolean, _align:String, _font:String, _color:String):TextFormat {
			var myFormat1:TextFormat = new TextFormat();
				myFormat1.size = _size;
				myFormat1.bold = _bold;
				myFormat1.italic = _italic;
				myFormat1.align = _align;
				myFormat1.font = _font;
				myFormat1.kerning = true;
				myFormat1.letterSpacing = -0.5;
				myFormat1.color = _color;
			return myFormat1;
		}
		
		public static function getSpriteItem(swfName:String, mcName:String):Sprite {
			var mcSprite:Sprite = new Sprite();
			try {
				var loadermax:ContentDisplay = LoaderMax.getContent(swfName);
				var swfloader:SWFLoader = loadermax.loader as SWFLoader;
				var classItem:Class =  swfloader.getClass(mcName);
				mcSprite = (new classItem() as Sprite);
			}catch (err:Error) {
				mcSprite = new Sprite();
			}
			return mcSprite;
		}
		
		
		public static function getBitMapItem(imgName:String):Sprite {
			var mcSprite:Sprite = new Sprite();
			try {
				var loadermax:ContentDisplay = LoaderMax.getContent(imgName);
				var loader:LoaderItem = loadermax.loader as LoaderItem;
				var bitmap:Bitmap = new Bitmap(Bitmap(loader.content.rawContent).bitmapData);
				bitmap.smoothing = true;
				mcSprite.addChild(bitmap);
			}catch (err:Error) {
				mcSprite = new Sprite();
			}
			return mcSprite;
		}
		
		public static function greySprite(sprite:DisplayObject, isGrey:Boolean = true):void {
			if (isGrey) {
				sprite.filters = [ new ColorMatrixFilter([0.3086, 0.6094, 0.0820, 0, 0, 0.3086, 0.6094, 0.0820, 0, 0, 0.3086, 0.6094, 0.0820, 0, 0, 0, 0, 0, 1, 0]) ];
			}else {
				sprite.filters = [ ];
			}
			
		}
		
		public static function convertStringToPoint(point:String):Point {
			var a:Array = point.split(',');
			var pos:Point = new Point();
			if(a[0]) pos.x = Number(a[0]);
			if(a[1]) pos.y = Number(a[1]);
			return pos;
		}
		
		
		//======================================Test========================================================================
		
		public static function mouseUpTest(evt:MouseEvent):void {
			var mc:* = evt.currentTarget;
			trace("movieclip: x = " + mc.x + " y= " + mc.y)
			mc.stopDrag();
		}
		
		public static function mouseDownTest(evt:MouseEvent):void {
			var mc:* = evt.currentTarget;
			mc.startDrag();
		}
		
		public static function tracePosFromMovie(movieclip:*):void {
			movieclip.addEventListener(MouseEvent.MOUSE_UP, mouseUpTest);
			movieclip.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownTest);
		}
	}

}